package com.nuanshui.heatedloan.middleware.mongodb;

import com.nuanshui.framework.lang.SysStringUtils;
import com.nuanshui.framework.springContext.SpringContextUtil;
import com.nuanshui.framework.utils.ReflectionUtils;
import org.springframework.data.mongodb.core.MongoTemplate;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MongoUtil {

    public static String getCollectionName(MongoTemplate mongoTemplate, Class<?> type) {
        String collectionName = null;
        Method method = ReflectionUtils.getAccessibleMethod
                (mongoTemplate, "determineCollectionName", new Class[]{Class.class});
        try {
            if (method != null) {
                collectionName = (String) method.invoke(mongoTemplate, type);
            }

        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        if(SysStringUtils.isEmpty(collectionName))
        {
            collectionName=getCollectionName(type.getSimpleName());
        }

        return collectionName;
    }

    public static String getCollectionName(Class<?> type) {

        MongoTemplate mongoTemplate=SpringContextUtil.getBean(MongoTemplate.class);
        if(mongoTemplate==null)
            return null;

        return getCollectionName(mongoTemplate,type);
    }

    public static String getCollectionName(String collectionName)
    {
        StringBuilder sb = new StringBuilder();
        int size = collectionName.length();
        for (int i = 0; i < size; i++) {

            if (i == 0) {
                sb.append(Character.toLowerCase(collectionName.charAt(0)));
            }
            sb.append(collectionName.charAt(0));
        }
        return  sb.toString();
    }

    public static void save(Object object,Class<?> type)
    {
        if(object==null)
            return;
        MongoTemplate mongoTemplate=SpringContextUtil.getBean(MongoTemplate.class);
        if(mongoTemplate==null)
            return;

        String collectionName=getCollectionName(mongoTemplate,type);
        if(SysStringUtils.isNotEmpty(collectionName))
        {
            mongoTemplate.save(object,collectionName);
        }
    }

    public static void save(Object object,String collectionName) {
        if(object==null)
            return;
        MongoTemplate mongoTemplate=SpringContextUtil.getBean(MongoTemplate.class);
        if(mongoTemplate==null)
            return;

        save(mongoTemplate,object,collectionName);
    }

    public static void save(MongoTemplate mongoTemplate,Object object,String collectionName) {
        if(object==null)
            return;

        collectionName=getCollectionName(collectionName);
        if(SysStringUtils.isNotEmpty(collectionName))
        {
            mongoTemplate.save(object,collectionName);
        }
    }
}
